package com.zenithmind.task.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.task.pojo.entity.TaskAttachment;
import com.zenithmind.task.pojo.query.TaskAttachmentQuery;
import com.zenithmind.task.pojo.vo.TaskAttachmentVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 任务附件服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface TaskAttachmentService extends IService<TaskAttachment> {

    /**
     * 分页查询任务附件列表
     *
     * @param query 查询条件
     * @param userId 当前用户ID
     * @return 分页结果
     */
    PageResult<TaskAttachmentVO> getTaskAttachmentPage(TaskAttachmentQuery query, String userId);

    /**
     * 根据ID查询任务附件详情
     *
     * @param id 附件ID
     * @param userId 当前用户ID
     * @return 附件详情
     */
    TaskAttachmentVO getTaskAttachmentById(String id, String userId);

    /**
     * 创建任务附件
     *
     * @param taskAttachment 附件信息
     * @param userId 创建者ID
     * @return 创建结果
     */
    Boolean createTaskAttachment(TaskAttachment taskAttachment, String userId);

    /**
     * 更新任务附件
     *
     * @param taskAttachment 附件信息
     * @param userId 操作者ID
     * @return 更新结果
     */
    Boolean updateTaskAttachment(TaskAttachment taskAttachment, String userId);

    /**
     * 删除任务附件
     *
     * @param id 附件ID
     * @param userId 操作者ID
     * @return 删除结果
     */
    Boolean deleteTaskAttachment(String id, String userId);

    /**
     * 批量删除任务附件
     *
     * @param ids 附件ID列表
     * @param userId 操作者ID
     * @return 删除结果
     */
    Boolean batchDeleteTaskAttachments(List<String> ids, String userId);

    /**
     * 分页查询附件列表
     *
     * @param taskId 任务ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param userId 当前用户ID
     * @return 附件分页列表
     */
    PageResult<TaskAttachmentVO> getAttachmentPage(String taskId, Integer pageNum, Integer pageSize, String userId);

    /**
     * 查询任务附件列表
     * 
     * @param taskId 任务ID
     * @param userId 当前用户ID
     * @return 附件列表
     */
    List<TaskAttachmentVO> getTaskAttachments(String taskId, String userId);

    /**
     * 查询评论附件列表
     * 
     * @param commentId 评论ID
     * @param userId 当前用户ID
     * @return 附件列表
     */
    List<TaskAttachmentVO> getCommentAttachments(String commentId, String userId);

    /**
     * 根据ID查询附件详情
     * 
     * @param id 附件ID
     * @param userId 当前用户ID
     * @return 附件详情
     */
    TaskAttachmentVO getAttachmentById(String id, String userId);

    /**
     * 上传任务附件
     * 
     * @param taskId 任务ID
     * @param file 文件
     * @param description 文件描述
     * @param userId 上传者ID
     * @return 上传结果
     */
    TaskAttachmentVO uploadTaskAttachment(String taskId, MultipartFile file, String description, String userId);

    /**
     * 上传评论附件
     * 
     * @param taskId 任务ID
     * @param commentId 评论ID
     * @param file 文件
     * @param description 文件描述
     * @param userId 上传者ID
     * @return 上传结果
     */
    TaskAttachmentVO uploadCommentAttachment(String taskId, String commentId, MultipartFile file, 
                                           String description, String userId);

    /**
     * 批量上传任务附件
     *
     * @param taskId 任务ID
     * @param files 文件数组
     * @param description 附件描述
     * @param userId 上传者ID
     * @return 上传结果
     */
    List<TaskAttachmentVO> batchUploadTaskAttachments(String taskId, MultipartFile[] files, String description, String userId);

    /**
     * 下载任务附件
     *
     * @param id 附件ID
     * @param userId 用户ID
     * @param response HTTP响应
     */
    void downloadTaskAttachment(String id, String userId, jakarta.servlet.http.HttpServletResponse response);

    /**
     * 获取附件预览URL
     *
     * @param id 附件ID
     * @param userId 用户ID
     * @return 预览URL
     */
    String getAttachmentPreviewUrl(String id, String userId);

    /**
     * 查询用户的任务附件
     *
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 分页结果
     */
    PageResult<TaskAttachmentVO> getUserTaskAttachments(String userId, Integer pageNum, Integer pageSize);

    /**
     * 搜索任务附件
     *
     * @param keyword 关键词
     * @param fileType 文件类型
     * @param userId 用户ID
     * @return 搜索结果
     */
    List<TaskAttachmentVO> searchTaskAttachments(String keyword, String fileType, String userId);

    /**
     * 批量上传附件
     *
     * @param taskId 任务ID
     * @param files 文件列表
     * @param userId 上传者ID
     * @return 上传结果
     */
    List<TaskAttachmentVO> batchUploadAttachments(String taskId, List<MultipartFile> files, String userId);

    /**
     * 更新附件信息
     * 
     * @param attachment 附件信息
     * @param userId 操作者ID
     * @return 更新结果
     */
    Boolean updateAttachment(TaskAttachment attachment, String userId);

    /**
     * 删除附件
     * 
     * @param id 附件ID
     * @param userId 操作者ID
     * @return 删除结果
     */
    Boolean deleteAttachment(String id, String userId);

    /**
     * 批量删除附件
     * 
     * @param ids 附件ID列表
     * @param userId 操作者ID
     * @return 删除结果
     */
    Boolean batchDeleteAttachments(List<String> ids, String userId);

    /**
     * 下载附件
     * 
     * @param id 附件ID
     * @param userId 下载者ID
     * @return 文件字节数组
     */
    byte[] downloadAttachment(String id, String userId);

    /**
     * 获取附件下载URL
     * 
     * @param id 附件ID
     * @param userId 用户ID
     * @return 下载URL
     */
    String getDownloadUrl(String id, String userId);

    /**
     * 生成缩略图
     * 
     * @param id 附件ID
     * @return 生成结果
     */
    Boolean generateThumbnail(String id);

    /**
     * 查询用户上传的附件
     * 
     * @param userId 用户ID
     * @param pageNum 页码
     * @param pageSize 页大小
     * @return 附件列表
     */
    PageResult<TaskAttachmentVO> getUserAttachments(String userId, Integer pageNum, Integer pageSize);

    /**
     * 获取附件统计信息
     * 
     * @param taskId 任务ID
     * @param userId 用户ID
     * @return 统计信息
     */
    Object getAttachmentStatistics(String taskId, String userId);

    /**
     * 清理过期附件
     * 
     * @param days 保留天数
     * @return 清理数量
     */
    Integer cleanExpiredAttachments(Integer days);
}
